home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
gfx
/
misc
/
uplot.lha
/
plot.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-15
|
7KB
|
357 lines
/* A program to plot UNIX plot files on an Amiga screen */
/*
/* Richard Gerber 5/5/92 gerber@sirius.astro.uiuc.edu */
/* Do with this what you wish (like add error checking! and proper font
support) */
/* Compiled with SAS/C 5.10b w/ 2.04 include files (I think it should
work with 1.3) */
#include <stdio.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <graphics/gfxmacros.h>
typedef short int INT16;
void readplot(char *);
void opengraphics();
void myexit(char *);
UBYTE handleIDCMP( struct Window *);
void erase();
void line(INT16, INT16, INT16, INT16);
void lineto(INT16, INT16);
void move(INT16, INT16);
void dotext(INT16, INT16, char *);
void reverse(char *, int);
void setlinemode(char *);
void circle(INT16, INT16, INT16);
void arc(void);
INT16 scale = 1;
char text[81], linemod[40];
struct Window *window=NULL;
struct GfxBase *GfxBase=NULL;
struct IntuitionBase *IntuitionBase=NULL;
struct Screen screen;
int wdth,ht;
int zeroy;
char fname[40];
struct NewWindow newwindow =
{
0,0,0,0, /* filled in later */
-1,-1,
CLOSEWINDOW|NEWSIZE,
WINDOWCLOSE|WINDOWDEPTH|SMART_REFRESH|WINDOWDRAG
|WINDOWSIZING,
NULL, NULL,
"UNIX Plot",
NULL, NULL,
100,50,
~0,~0,
WBENCHSCREEN
};
main(int argc, char *argv[])
{
ULONG signalmask, signals;
UBYTE done = 0;
if(argc!=2) {printf("Usage: %s plot_file.\n",argv[0]); exit(1);}
opengraphics();
strcpy(fname,argv[1]);
readplot(argv[1]);
signalmask = 1L << window->UserPort->mp_SigBit;
while ( !done )
{
signals = Wait(signalmask);
if (signals & signalmask)
done = handleIDCMP(window);
};
myexit(NULL);
}
void
readplot(char *filename)
{
FILE *fp=NULL;
int n;
INT16 curx, cury;
unsigned char com;
INT16 pts[6];
fp = fopen(filename,"rb");
if(fp==NULL) myexit("Can't open file");
while(!feof(fp))
{
n = fscanf(fp,"%c",&com);
if(n==EOF) break;
switch(com) {
case 'e':
erase();
break;
case 's':
fread((char *)pts,8,1,fp);
reverse((char *)pts,4);
scale = pts[2];
if(scale!=pts[3])
printf("Error: scale not square!\n");
break;
case 'l':
fread((char *)pts,8,1,fp);
reverse((char *)pts,4);
curx = pts[2]; cury = pts[3];
line(pts[0],pts[1],pts[2],pts[3]);
break;
case 'n':
fread((char *)pts,4,1,fp);
reverse((char *)pts,2);
lineto(pts[0],pts[1]);
curx = pts[0]; cury = pts[1];
break;
case 'm':
fread((char *)pts,4,1,fp);
reverse((char *)pts,2);
curx = pts[0]; cury = pts[1];
move(curx,cury);
break;
case 't':
fgets(text,80,fp);
dotext(curx,cury,text);
break;
case 'f':
fgets(linemod,40,fp);
setlinemode(linemod);
break;
case 'c':
fread((char *)pts,6,1,fp);
reverse((char *)pts,3);
circle(pts[0],pts[1],pts[2]);
break;
case 'a':
fread((char *)pts,12,1,fp);
arc();
break;
default:
printf("Unknown commnd %c,\n",com);
myexit("Error in data file?");
break;
break;
}
}
fclose(fp);
}
void
opengraphics(void)
{
IntuitionBase = (struct IntuitionBase *)OpenLibrary(
"intuition.library",33L);
if(IntuitionBase==NULL) myexit("Intuition Library");
GfxBase = (struct GfxBase *)OpenLibrary(
"graphics.library",33L);
if(GfxBase==NULL) myexit("Graphics Library");
GetScreenData((CPTR *)&screen, sizeof(struct Screen),
WBENCHSCREEN, NULL);
newwindow.LeftEdge = 0;
newwindow.TopEdge = 0;
newwindow.Width = screen.Width;
newwindow.Height = screen.Height;
ht = screen.Height - 2*screen.BarHeight;
wdth = screen.Width - 2*screen.BarHeight;
zeroy = screen.Height - 5;
window = (struct Window *)OpenWindow(&newwindow);
if(window==NULL) myexit("OpenWindow()");
}
void myexit(char *message)
{
if(message!=NULL) printf("Program ending: %s error\n",message);
if(window) CloseWindow(window);
if(GfxBase) CloseLibrary((struct Library *)GfxBase);
if(IntuitionBase) CloseLibrary((struct Library *)IntuitionBase);
exit(1);
}
UBYTE handleIDCMP( struct Window *w)
{
UBYTE flag = 0;
struct IntuiMessage *message = NULL;
ULONG class;
while(message = (struct IntuiMessage *)GetMsg(w->UserPort) )
{
class = message->Class;
ReplyMsg( (struct Message *)message);
switch (class)
{
case CLOSEWINDOW:
flag = 1;
break;
case NEWSIZE:
wdth = window->Width - 2*screen.BarHeight;
ht = window->Height - 2*screen.BarHeight;
zeroy = window->Height - 5;
erase();
readplot(fname);
break;
default:
break;
}
}
return(flag);
}
void erase(void)
{
SetAPen(window->RPort,0);
RectFill(window->RPort,0,0,
window->Width,window->Height);
RefreshWindowFrame(window);
}
void
line(INT16 x0, INT16 y0, INT16 x1, INT16 y1)
{
int xa, ya, xb, yb;
xa = (x0*wdth)/scale ;
xb = (x1*wdth)/scale ;
ya = -(y0*ht)/scale + zeroy;
yb = -(y1*ht)/scale + zeroy;
SetAPen(window->RPort, 1);
Move(window->RPort,xa,ya);
Draw(window->RPort,xb,yb);
}
void lineto(INT16 x1, INT16 y1)
{
int xa, ya;
xa = (x1*wdth)/scale ;
ya = -(y1*ht)/scale + zeroy;
SetAPen(window->RPort, 1);
Draw(window->RPort,xa,ya);
}
void move(INT16 x0, INT16 y0)
{
int xa, ya;
xa = (x0*wdth)/scale ;
ya = -(y0*ht)/scale + zeroy;
Move(window->RPort,xa,ya);
}
void circle(INT16 x0, INT16 y0, INT16 radius)
{
int xa,ya,rx,ry;
xa = (x0*wdth)/scale;
ya = -(y0*ht)/scale + zeroy;
ry = radius*ht/scale;
rx = radius*wdth/scale;
DrawEllipse(window->RPort,xa,ya,rx,ry);
}
void arc(void)
{
printf("Arc command not implemented.\n");
}
void dotext(INT16 x0, INT16 y0, char *txt)
{
int length;
char strip[80];
int xa, ya;
int i;
int textheight = 8;
struct IntuiText it = {
2,0, JAM1, 1,1, NULL, NULL, NULL };
USHORT holdptrn;
holdptrn = window->RPort->LinePtrn;
window->RPort->LinePtrn = 0xFFFF;
for(i=0;i<80;i++) strip[i]='\0';
xa = (x0*wdth)/scale ;
ya = -(y0*ht)/scale + zeroy - textheight/2;
length = strlen(txt);
strncpy(strip,txt,length-1);
it.IText = strip;
PrintIText(window->RPort, &it, xa, ya);
window->RPort->LinePtrn = holdptrn;
}
void
reverse(char array[], int i)
/* 99% of the time spent writing this program */
/* was spent figuring out that the bytes are reversed in the plot file */
/* This routine puts them back */
/* i is the actual number of short ints passed */
{
int j;
char fix[12];
for(j=0;j<2*i;j++) fix[j] = array[j];
for(j=0;j<2*i;j+=2)
{
array[j] = fix[j+1];
array[j+1] = fix[j];
}
}
void
setlinemode(char *t)
{
int result, length;
char strip[20];
length = strlen(t);
strncpy(strip,t,length-1);
strip[length-1] = '\0';
if(0==(result=strcmp(strip,"solid")))
{
window->RPort->LinePtrn = 0xFFFF;
}
if(0==(result=strcmp(strip,"longdashed")))
{
window->RPort->LinePtrn = 0xFF00;
}
if(0==(result=strcmp(strip,"dotted")))
{
window->RPort->LinePtrn = 0xCCCC;
}
if(0==(result=strcmp(strip,"shortdashed")))
{
window->RPort->LinePtrn = 0xF0F0;
}
if(0==(result=strcmp(strip,"dotdashed")))
{
window->RPort->LinePtrn = 0xF6F6;
}
}